// 1.合并声明
// 同一名称的两个独立声明会被合并成一个单一声明
// 合并后的声明拥有原先两个声明的特性

// 关键字	        作为类型使用	作为值使用
// class	        yes	            yes
// enum	            yes	            yes
// interface	    yes	            no
// type	            yes	            no
// function	        no	            yes
// var,let,const	no	            yes


// 类既可以作为类型使用，也可以作为值使用，接口只能作为类型使用
/**
 *声明一个类的时候
 *得到两个类型，一个是构造函数的类型，一个是实例的类型
 */
class Person{
    name:string=''
}
let p1:Person;//作为类型使用
let p2 = new Person();//作为值使用
// typeof Person 得到的是Person的构造函数类型
// let c : typeof Person = p2  //类型 "Person" 中缺少属性 "prototype"，但类型 "typeof Person" 中需要该属性。ts(2741)


// interface Animal{
//     name:string
// }
// let a1:Animal;
// let a2 = Animal;//接口类型不能用作值

// 2.合并类型声明
// 可以通过接口合并的特性给一个第三方为扩展类型声明
interface Animal{
    name:string
}
// 从这个types\animal\index.d.ts文件中，可以得到Animal其他接口
let a1:Animal={name:'ikki',age:10};
console.log(a1.name);
console.log(a1.age);

// 3.使用命名空间扩展类
class Form {
    username: Form.Item='';
    password: Form.Item='';
}
namespace Form {
    export class Item{}
}
let item:Form.Item = new Form.Item();
console.log(item);

// 4.使用命名空间扩展函数
function greeting(name: string): string {
    return greeting.words+name;
}
namespace greeting {
    export let words = "Hello,";
}
console.log(greeting('ikki'))

// 5.使用命名空间扩展枚举类型
enum Color {
    red = 1,
    yellow = 2,
    blue = 3
}
namespace Color {
    export const green=4;
    export const purple=5;
}
console.log(Color.green)

// 6.生成声明文件
// 把TS编译成JS后丢失类型声明，我们可以在编译的时候自动生成一份JS文件
// {
//     "compilerOptions": {
//        "declaration": true, /* Generates corresponding '.d.ts' file.*/
//     }
// }